


// /*
// *    @订阅消息流程
// *    1.实例化底层网络通信事件监控句柄--用于事件监控
// *    2.实例化连接对象
// *    3.实例化信道对象
// *    4.申明交换机
// *    5.申明队列
// *    6.针对交换机和队列进行绑定
// *    7.订阅消息
// *    8.释放资源
// */

// #include <ev.h>
// #include <amqpcpp.h>
// #include <amqpcpp/libev.h>
// #include <openssl/ssl.h>
// #include <openssl/opensslv.h>
// #include <iostream>
// #include <string>

// /*
//  *    @发布消息流程
//  *    1.实例化底层网络通信事件监控句柄--用于事件监控
//  *    2.实例化连接对象
//  *    3.实例化信道对象
//  *    4.申明交换机
//  *    5.申明队列
//  *    6.针对交换机和队列进行绑定
//  *    7.发布消息
//  *    8.释放资源
//  */

// using EventLoopPtr = struct ev_loop*;

// void on_message(AMQP::TcpChannel* channel,const AMQP::Message &message, uint64_t deliveryTag, bool redelivered)
// {
//     std::string msg;
//     msg.assign(message.body(),message.bodySize());
//     std::cout<<"订阅的消息已更新: "<<msg<<std::endl;
//     //消息确认,重要!--ack应答
//     channel->ack(deliveryTag);
// }
// int main()
// {
//     //事件监控句柄
//     EventLoopPtr loop = EV_DEFAULT;
//     //关联事件监控
//     AMQP::LibEvHandler handler(loop);
//     //创建连接对象
//     AMQP::Address address("amqp://root:123456@127.0.0.1:5672/");
//     AMQP::TcpConnection conn(&handler,address);
//     //构造信道对象
//     AMQP::TcpChannel channel(&conn);
//     //声明交换机
//     AMQP::Deferred& exchange_defferred = channel.declareExchange("test-exchange",AMQP::ExchangeType::direct);
//     //Deferred类型需要设置回调函数，成功、错误、完成后...
//     exchange_defferred.onError([](const char* msg)
//     {
//         std::cerr<<"申明交换机失败 : "<<msg<<std::endl;
//         exit(1);
//     });
//     exchange_defferred.onSuccess([]()
//     {
//         std::cout<<"申明交换机成功!"<<std::endl;
//     });
    
//     //申明队列
//     AMQP::Deferred& queue_defferred  = channel.declareQueue("test-queue");

//     queue_defferred.onError([](const char*msg)
//     {
//         std::cerr<<"申明队列test-queue失败,原因: "<<msg<<std::endl;
//         exit(1);
//     });

//     queue_defferred.onSuccess([]()
//     {
//         std::cout<<"申明队列成功!"<<std::endl;
//     });

//     //绑定交换机和队列
//     AMQP::Deferred& bind_defferred = channel.bindQueue("test-exchange","test-queue","1");
//     bind_defferred.onError([](const char*msg)
//     {
//         std::cerr<<"绑定队列test-queue失败,原因: "<<msg<<std::endl;
//         exit(1);
//     });

//     bind_defferred.onSuccess([]()
//     {
//         std::cout<<"绑定队列test-queue成功!"<<std::endl;
//     });

//     //订阅消息队列
//     AMQP::DeferredConsumer& consumer_defferred = channel.consume("test-queue");
//     consumer_defferred.onError([](const char* msg)
//     {
//         std::cerr<<"订阅队列消息失败"<<std::endl;
//         exit(1);
//     });
//     consumer_defferred.onReceived(std::bind(on_message,\
//                                             &channel,std::placeholders::_1,\
//                                             std::placeholders::_2,\
//                                             std::placeholders::_3));
//     //启动IO事件循环
//     ev_run(loop);

//     return 0;
// }

////////////////////////////////////////////////////
// 二次封装测试
#include "../../common/rabbitmq.hpp"
#include <gflags/gflags.h>

DEFINE_string(user, "root", "rabbitmq访问用户名");
DEFINE_string(pswd, "123456", "rabbitmq访问密码");
DEFINE_string(host, "127.0.0.1:5672", "rabbitmq服务器地址信息 host:port");


DEFINE_bool(run_mode, false, "程序的运行模式，false-调试； true-发布；");
DEFINE_string(log_file, "", "发布模式下，用于指定日志的输出文件");
DEFINE_int32(log_level, 0, "发布模式下，用于指定日志输出等级");

void callback(const char *body, size_t sz)
{
    std::string msg;
    msg.assign(body, sz);
    std::cout << msg << std::endl;
}

int main(int argc, char *argv[])
{
    google::ParseCommandLineFlags(&argc, &argv, true);
    init(FLAGS_run_mode, FLAGS_log_file, FLAGS_log_level);
    MQclient client(FLAGS_user, FLAGS_pswd, FLAGS_host);

    client.compoents("test-exchange", "test-queue");
    client.consumer("test-queue", callback);

    std::this_thread::sleep_for(std::chrono::seconds(60));
    return 0;
}